package com.qr.controller;

import com.qr.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller
@RequestMapping("/user")
public class UserController {

    //返回String,Model这个对象可以帮我们存数据
    @RequestMapping("/testString")
    public String testString(Model model){
        System.out.println("testString方法执行了...");
        // 模拟从数据库中查询出User对象,设置属性
        User user = new User();
        user.setUsername("美美");
        user.setPassword("123");
        user.setAge(30);
        // model对象
        model.addAttribute("user",user);
        return "success";
    }

    /**
     * 是void
     * 请求转发一次请求，不用编写项目的名称
     */
    @RequestMapping("/testVoid")
    public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("testVoid方法执行了...");
        // 编写请求转发的程序,手动转发,是不会帮我们执行视图的解析器的,所以要写转发的具体位置
        // request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);

        /**
         *  如果重定向是两次请求,使用response这个对象的sendRedirect
         *  两次请求所以需要些项目的名字request.getContextPath
         *  这个都是跳到某个jsp,然后tomcat帮我们生成具体的html,最终响应给用户
         */
        // response.sendRedirect(request.getContextPath()+"/index.jsp");

        // 响应中文可能会有中文乱码，设置中文乱码
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        /**
         * 以后有可能会直接进行响应,就是你发送请求,我直接通过输出流将数据响应给你的浏览器
         * 直接拿到输出流response.getWriter(),输出数据print("你好");
         */
        //拿到输出流response.getWriter()然后使用该流给浏览器响应数据
        response.getWriter().print("你好");
        // 转发完成不想让后面代码执行就写rturn
        return;
    }

    /**
     * 返回ModelAndView
     * @return
     */
    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView(){
        // 创建ModelAndView对象
        ModelAndView mv = new ModelAndView();
        System.out.println("testModelAndView方法执行了...");
        // 模拟从数据库中查询出User对象
        User user = new User();
        user.setUsername("小凤");
        user.setPassword("456");
        user.setAge(30);

        // 把user对象存储到mv对象中，也会把user对象存入到request对象
        mv.addObject("user",user);

        // 跳转到哪个页面
        mv.setViewName("success");

        return mv;
    }

    /**
     * 使用关键字的方式进行转发或者重定向
     * @return
     */
    @RequestMapping("/testForwardOrRedirect")
    public String testForwardOrRedirect(){
        System.out.println("testForwardOrRedirect方法执行了...");

        // 请求的转发
        // return "forward:/WEB-INF/pages/success.jsp";

        // 重定向,这一块为什么没有项目名称,底层给我们添加了项目名称
        return "redirect:/index.jsp";
    }

    /**
     * 模拟异步请求响应
     * @ResponseBody将返回的对象转换为json数据
     */
    @RequestMapping("/testAjax")
    public @ResponseBody User testAjax(@RequestBody User user){
        System.out.println("testAjax方法执行了...");
        // 客户端发送ajax的请求，传的是json字符串，后端把json字符串封装到user对象中
        System.out.println(user);
        // 做响应，模拟查询数据库
        user.setUsername("haha");
        user.setAge(40);
        // 做响应,mvc框架 已经帮我们做好了,我们返回对象就行,需要加入一个注解才可以,转成对应的串
        return user;
    }

}